using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using FiltronASP.Helpers.Constants;

namespace FiltronASP.Models.DAO.Interfaces.Filtron
{
    /// <summary>
    /// Interfejs dla operacji bazodanowych specyficznych dla tabeli <code>Filtron_filters</code>.
    /// </summary>
    public interface IFiltronFilterDAO : IGenericDAO<FiltronFilter, System.Nullable<int>>
    {
        /// <summary>
        /// Pobieranie obiektow na podstawie silnika.
        /// </summary>
        /// <param name="engineId">silnik</param>
        /// <returns>rekordy o zadanym silniku lub null, gdy nie ma</returns>
        IQueryable<FiltronFilter> FindByEngine(int engineId);

        /// <summary>
        /// Pobieranie obiektow na podstawie typu.
        /// </summary>
        /// <param name="typeId">typ filtru</param>
        /// <returns>rekordy o zadanym typie lub null, gdy nie ma</returns>
        IQueryable<FiltronFilter> FindByType(int typeId);

        /// <summary>
        /// Pobieranie obiektow na podstawie silnika i modelu.
        /// </summary>
        /// <param name="engineId">silnik</param>
        /// <param name="modelId">model</param>
        /// <returns>rekordy o zadanym silniku i modelu lub null, gdy nie ma</returns>
        IQueryable<FiltronFilter> FindByEngineAndModel(int engineId, int modelId);

        IQueryable<FiltronFilter> FindByFilterNumber(string filterNumber);
        IQueryable<FiltronFilter> FindByWixFilterNumber(string wixFilterNumber);
        IQueryable<FiltronFilter> FindByWixFilterNumberContains(string wixFilterNumber);
        IQueryable<FiltronFilter> FindByWixFilterNumberContains(string wixFilterNumber, Constants.TSearchInclusionMode searchMode);
        IQueryable<FiltronFilter> FindByWixFilterNumberContains(string wixFilterNumber, Constants.TSearchInclusionMode searchMode, int limit);

        /// <summary>
        /// Pobieranie obiektow na podstawie wymiarow.
        /// </summary>
        /// <param name="height">wysokosc</param>
        /// <param name="width">szerokosc</param>
        /// <param name="length">dlugosc</param>
        /// <param name="outsideDiaTop">zewnetrzna gorna srednica</param>
        /// <param name="outsideDiaBottom">zewnetrzna dolna srednica</param>
        /// <param name="insideDiaTop">wewnetrzna gorna srednica</param>
        /// <param name="insideDiaBottom">wewnetrzna dolna srednica</param>
        /// <returns>rekordy o zadanych wymiarach lub null, gdy nie ma</returns>
        IQueryable<FiltronFilter> FindByDimensions(
            decimal dimA, int dimAdiff,
            decimal dimB, int dimBdiff,
            decimal dimC, int dimCdiff,
            decimal dimD, int dimDdiff,
            decimal dimE, int dimEdiff,
            decimal dimF, int dimFdiff,
            decimal dimG, int dimGdiff,
            decimal dimH, int dimHdiff,
            int filterShape);

        /// <summary>
        /// Pobieranie obiektow spaginowanych na podstawie wymiarow.
        /// </summary>
        /// <param name="height">wysokosc</param>
        /// <param name="width">szerokosc</param>
        /// <param name="length">dlugosc</param>
        /// <param name="outsideDiaTop">zewnetrzna gorna srednica</param>
        /// <param name="outsideDiaBottom">zewnetrzna dolna srednica</param>
        /// <param name="insideDiaTop">wewnetrzna gorna srednica</param>
        /// <param name="insideDiaBottom">wewnetrzna dolna srednica</param>
        /// <returns>rekordy o zadanych wymiarach lub null, gdy nie ma</returns>
        IQueryable<FiltronFilter> FindByDimensionsPaginated(
            decimal dimA, int dimAdiff,
            decimal dimB, int dimBdiff,
            decimal dimC, int dimCdiff,
            decimal dimD, int dimDdiff,
            decimal dimE, int dimEdiff,
            decimal dimF, int dimFdiff,
            decimal dimG, int dimGdiff,
            decimal dimH, int dimHdiff,
            int filterShape, int start, int offset);
    }
}
